	// Variables globales
var KEY = "ABQIAAAAW6ZkayH6hhgMyC2y6LQx8xTlOAjHTmgj9z0QOzdQFV7VnifGuxSJsOzr3eQromRGXbLCHJKjeEnNNw";
var map;
var geocoder = null;
var gdir;
var addressMarker;
var infoCoordenadasLugar;
var marcadorCrearLugarSet = false;
var marcadorArrastrable;
var markerTest;
var mgr;
var archivo;

//Deteccion Navegadores
var firefox  = !document.layers && !document.all;

var ie  = document.all != null;  //ie4 and above

var ie5 = document.getElementById && document.all;

var ie6 = document.getElementById && document.all&&(navigator.appVersion.indexOf("MSIE 6.")>=0);
var ie7 = window.XMLHttpRequest;
var opera = (navigator.userAgent.indexOf("Opera") == -1);


function inicializa() {
    if (GBrowserIsCompatible())
    	creaMapa();
	else{
		alert("Su navegador no es compatible con nuestra aplicacion de Google Maps")
	}
 }

function creaMapa () {
	// crea y centra el mapa
    map = new GMap2($("map"));
		
	// centra el mapa en las coordenadas de Sevilla
    map.setCenter(new GLatLng(37.383317, -5.996502), 15);
	geocoder = new GClientGeocoder();
		
	// pone el tipo de mapa como hibrido
	map.setMapType(G_HYBRID_MAP);
	
	
    gdir = new GDirections(map, $("directions"));
    GEvent.addListener(gdir, "load", onGDirectionsLoad);
    GEvent.addListener(gdir, "error", handleErrors);
		
	//anade los controles
	map.addControl(new GLargeMapControl()); //zoom
    map.addControl(new GMapTypeControl()); //tipo map
    map.addControl(new GOverviewMapControl()); //control overview
	/* map.addControl(new google.maps.LocalSearch(), 
		 				new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, 
						new GSize(10,20)));*/
	
}

/**
 * Calcula la ruta segun la informacion del lugar de origen y de destino
 * @param {Object} address
 * @param {Object} es_admin
 */
function showAddress(address, es_admin) {
	if(address) {
		geocoder.getLatLng(
		    address,
		    function(point) {
		      if (!point) {
		        alert("No se encontro :" + address);
		      } else {
			  	//Limpiamos el mapa de marcadores u otros objetos puestos 
				//sobre el mapa en caso de realizar una nueva busqueda
			  	map.clearOverlays();
		        map.setCenter(point, 13);
				
		        var marker = new GMarker(point);
				GEvent.addListener(marker, "click", function(){
					mostrarInfoNuevoLugar(es_admin,marker,marker.getPoint(), address);
				});
				GEvent.addListener(marker,"drag", function(){
					if ($("latitud") && $("longitud")) {
						$("latitud").value = marker.getPoint().y;
						$("longitud").value = marker.getPoint().x;
					}
				});
				GEvent.addListener(marker,"dragstart", function(){
					marker.closeInfoWindow();
				});	
				
		        map.addOverlay(marker);
				var center = map.getCenter();
				mostrarInfoNuevoLugar(es_admin, marker, marker.getPoint(), address)
		      }
		    }
		  ); 
	  }
	  else
	  	alert("Por favor, introduzca un lugar o direccion para buscar."); 
}

/* Permite hallar la ruta entre dos puntos y según uno de los idiomas elegidos */
function setDirections(desde, hasta, locale) {
	map.clearOverlays();
	if(desde && hasta) 
   		gdir.load("from: " + desde + " to: " + hasta, { "locale": locale });
   	else
   		alert("Por favor, introduzca lugares origen y destino de la ruta.");
}

function handleErrors(){
	   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	     alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gdir.getStatus().code);
	   
	   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	     alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code);

	//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
	//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);
	     
	   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	     alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gdir.getStatus().code);

	   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	     alert("A directions request could not be successfully parsed.\n Error code: " + gdir.getStatus().code);
	    
	   else alert("An unknown error occurred.");  
}

function onGDirectionsLoad(){ 
}

function mostrarInfoNuevoLugar(es_admin,marker, point, address){
	if(!es_admin)
	   marker.openInfoWindowHtml(address);
	else{
	   $("latitud").value=point.y;
	   $("longitud").value=point.x;
       var html = "<br/><button  class='mybtn' onclick='crearFormularioNuevoLugar();"
       +"'>Guardar lugar</button>";
	   marker.openInfoWindowHtml(address + "" + html);
    }
}

//var grupoMarcadores = [];
var admin = false;
var tmpMarker; //marcador temporal, usado para el marcador arrastrable(draggable)
var keys = new Array();
var grupoMarcadores = [];
var htmls = [];

function inicializaLugaresInteres(archivoLugares, es_admin){
	if(map)
		map.clearOverlays();
	if(es_admin) {
		
		admin = true;
		archivo = "../xml/" + archivoLugares;
		inicializarGrupoTipoMarcadores(1);
		//Se hace asi para que se de el tiempo suficiente para que se lea el 
	//archivo XML y se tenga preparada el array hash grupoTipoMarcadores
		setTimeout("crearMapayPonerMarcadores(archivo, null, 1)", 1000);
	}		
	else {
		archivo = "xml/" + archivoLugares;	
		inicializarGrupoTipoMarcadores();
		setTimeout("crearMapayPonerMarcadores(archivo)", 1000);
	}	
}

var icono;
var enc;
/**
 * Funcion que define un tipo de icono para cada tipo de lugar.
 * @param {Object} tipo:Cadena que describe el tipo de lugar
 */
function defineTipoIconoMarcador(tipo, admin){
	ico = new GIcon();
	enc=false;
	var ruta;
	if(admin) {
		ruta="../images/iconos/";
	}
	else {
		ruta="images/iconos/";
	}
	if(tipo == "General"){
		ico.image =ruta + "general.gif";
		enc=true;
	}
	else if(tipo=="Monumentos"){
		ico.image =ruta + "monumento.gif";
		enc=true;
	}
	else if(tipo.indexOf("Acad")>=0){
		ico.image =ruta + "academico.gif";
		enc=true;
	}
	else if(tipo.indexOf("Parques") >=0){
		ico.image =ruta + "arbol.gif";
		enc=true;
	}
	else if(tipo.indexOf("Cine")>=0){
		ico.image =ruta + "claqueta.gif";
		enc=true;
	}
	else if(tipo.indexOf("Cultural")>=0){
		ico.image =ruta + "libro.gif";
		enc=true;
	}
	else if(tipo.indexOf("Compras")>=0){
		ico.image =ruta + "credito.gif";
		enc=true;
	}
	else if(tipo.indexOf("Divers")>=0){
		ico.image =ruta + "diversion.gif";
		enc=true;
	}
	else if(tipo.indexOf("Discotecas")>=0){
		ico.image =ruta + "disco.gif";
		enc=true;
	}
	else if(tipo.indexOf("Depor")>=0){
		ico.image =ruta + "balon.gif";
		enc=true;
	}
	else if(tipo.indexOf("Bar")>=0){
		ico.image =ruta + "cerveza.gif";
		enc=true;
	}
	else if(tipo.indexOf("Transportes")>=0){
		ico.image =ruta + "transporte2.gif";
		enc=true;
	}
	ico.iconSize = new GSize(24, 24);
	ico.iconAnchor = new GPoint(9, 34);
	ico.infoWindowAnchor = new GPoint(9, 2);
	ico.infoShadowAnchor = new GPoint(18, 25);
	
	return ico;
}
	
function crearMarcador(point, html, tipo, admin){
	
	if(!admin)
		icono = defineTipoIconoMarcador(tipo);
	else
		icono = defineTipoIconoMarcador(tipo, admin);
	markerOptions = { icon:icono };
	
	var marker;
	//Si no se ha encontrado icono entonces no asignar el icono
	if(enc)
		marker = new GMarker(point, markerOptions);
	else
		marker = new GMarker(point);
		
	grupoMarcadores[tipo].push(marker);
	GEvent.addListener(marker, "click", function(){
		marker.openInfoWindowHtml(html, {maxWidth: 320 , maxHeight: 240, autoscroll:true});
	});
	return marker;
}

function Markers(tipo){
	if (map) {
		var selectTiposLugares = $("tipo_lista");
		//Ocultamos todos los marcadores previamente existentes(Evitandose superposicion de 
		//marcadores que ya estaban antes en el mapa -> Evitamos degradacion en el rendimiento 
		//del mapa)
		for (var i = 0; i < keys.length; i++) {
			for (var j = 0; j < grupoMarcadores[keys[i]].length; j++) {
				//map.removeOverlay(grupoMarcadores[keys[i]][j]);
				grupoMarcadores[keys[i]][j].hide();
			}
		}
		
		//si no hay opcion seleccionada mostramos todos los lugares sin distincion de tipo
		if (selectTiposLugares.selectedIndex == -1){ 
			for(var i = 0 ; i < keys.length ; i++){
				for(var j = 0; j < grupoMarcadores[keys[i]].length ; j++)
					//map.addOverlay(grupoMarcadores[keys[i]][j], 12);
					grupoMarcadores[keys[i]][j].show();
			}
		}
		
		if (selectTiposLugares.selectedIndex != -1) {
			for(var k = 0 ; k <selectTiposLugares.options.length ; k++){
				if(selectTiposLugares.options[k].selected){
					for (var i = 0; i < grupoMarcadores[keys[k]].length; i++) {	
						//map.addOverlay(grupoMarcadores[keys[k]][i], 12);
						grupoMarcadores[keys[k]][i].show();
					
					}
				}
				else{
					for (var i = 0; i < grupoMarcadores[keys[k]].length; i++) {	
						//map.removeOverlay(grupoMarcadores[keys[k]][i]);
						grupoMarcadores[keys[k]][i].hide();
					}
				}
			}
			
		}
	}//fin if(map)
}

/**
 * Crea un array asociativo(como un hash) donde cada posicion (clave) se identifica por un tipo de lugar
 * (General, Cultural, etc.). Notar que el acceso a cada uno de sus elementos se haran mediante cadenas 
 * y no enteros como en los arrays "normales".Inicialmente cada clave estara vacia.
 * @param {Object} admin
 */
function inicializarGrupoTipoMarcadores(admin){
	var rutaXMLTipoLugares;
	if(admin && admin == 1) {
		rutaXMLTipoLugares = "../xml/tiposLugares.xml";
	}
	else {
		rutaXMLTipoLugares = "xml/tiposLugares.xml";
	}
	
	GDownloadUrl(rutaXMLTipoLugares, function(data) {
		
		if(firefox || opera &&!(ie || ie6 || ie7)){
		
			var xmlDocTiposLugares = GXml.parse(data); 
			var tiposLugares = xmlDocTiposLugares.documentElement.getElementsByTagName("tipo");
			var strInfoTiposLug = "{";
			/*	Debemos conseguir algo tal que asi
			*	var markerGroups = { "restaurant": [], "bar": []};	
				//Consultar http://googlemapsapi.blogspot.com/2007/04/v277-gmarker-show-hide-and-ishidden.html
			*	
			*	Lo que se hace es crear un Array en el que cada fila viene indexada por una cadena identificativa 
			*	(como si fuera una key).De este modo podremos acceder a una fila de un  array no por un numero
			*  entero(como ha sido desde siempre) sino por la cadena asociada a dicha fila.  
			*  ->Esto es lo que se conoce como ARRAYS ASOCIATIVOS<-
			*
			*/
			var i;
			for (i = 0; i < tiposLugares.length - 1; i++) {
			  	//grupoMarcadores.push(GXml.value(tiposLugares[i]));
				keys[i] = GXml.value(tiposLugares[i]);
				strInfoTiposLug += "\"" + keys[i] +"\": [],";
			}
			keys[i] = GXml.value(tiposLugares[i]);
			strInfoTiposLug += "\"" + keys[i]+"\" : []}";
				
			//la instruccion contenida en la cadena de caracteres se pasa como parametro en eval
			//que es la funcion que hara ejecutar dicha instruccion; encargada de inicializar el array.
			eval("grupoMarcadores = " + strInfoTiposLug);
		}
		else{
			var xmlDocTiposLugares=new ActiveXObject("Microsoft.XMLDOM");
			xmlDocTiposLugares.async="false";
			xmlDocTiposLugares.load(rutaXMLTipoLugares);
			var tiposLugares = xmlDocTiposLugares.getElementsByTagName("tipo");
		    var strInfoTiposLug = "{";
			var i;
			for (i = 0; i < tiposLugares.length - 1; i++) {
			  	//grupoMarcadores.push(GXml.value(tiposLugares[i]));
				keys[i] = GXml.value(tiposLugares[i]);
				strInfoTiposLug += "\"" + keys[i] +"\": [],";
			}
			keys[i] = GXml.value(tiposLugares[i]);
			strInfoTiposLug += "\"" + keys[i]+"\" : []}";
			eval("grupoMarcadores = " + strInfoTiposLug);
		}
		//alert("grupoMarcadores = " + strInfoTiposLug);
	});
		
	//Al pulsar el boton buscar es posible que se hayan elegido ya los tipos
	//Llamamos aqui a cualquier funcion que haga uso del array de marcadores ya q su creacion 
	//es paralelo a la ejecucion de codigo de inicializacion del mapa 
	//debido a la asincronia con GDownloadURL
	
	return grupoMarcadores;
}

function ocultarMarkers(selectTiposLugares){
	for (var i = 0; i < selectTiposLugares.options.length; i++) {
		if(selectTiposLugares.options[i].selected){
			break;
		}
	}

	for(var k = 0 ; k <selectTiposLugares.options.length ; k++){
		if(selectTiposLugares.options[k].selected){
			for (var i = 0; i < grupoMarcadores[keys[k]].length; i++) {	
				grupoMarcadores[keys[k]][i].show();	
			}
		}
		else{
			for (var i = 0; i < grupoMarcadores[keys[k]].length; i++) {	
				grupoMarcadores[keys[k]][i].hide();
			}
		}
	}
}
/**
 *  Ver tambien anadirEventoAnadirLugar
 * @param {Object} overlay
 * @param {Object} point
 */
function crearMarcadorArrastrable(overlay,point){
	markerTest = new GMarker(point, {
				draggable: true});
			
	tmpMarker = markerTest;
	GEvent.addListener(tmpMarker, "click", function(){
		var html = "marcador situado en" + markerTest.getPoint() + "<br/>";
		html += "<button class='mybtn'>Descartar</button>";
		tmpMarker.openInfoWindowHtml(html);
		actualizaLatLongForm();
	});
	
	GEvent.addListener(tmpMarker, "dragstart", function(){
			map.closeInfoWindow();
	});
	
	GEvent.addListener(tmpMarker, "dragend", function(){
		var html = "Has arrastrado este marcador<br/>"+
				"<div onclick = '$(\"menuAnadirLugar\").setAttribute(\"style\", \"z-index:0\")'>"
				+"<b>A&ntilde;adir este lugar a mi agenda</b></div>";
		var html = "<button class='mybtn' id='nuevolugar' onclick = 'crearFormularioNuevoLugar()'>Nuevo</button>"
		tmpMarker.openInfoWindowHtml(html);
	});	
	
	GEvent.addListener(tmpMarker, "drag", function(){
		actualizaLatLongForm();
	});
	
	map.addOverlay(tmpMarker);
}

function cierraGlobo(){
	if(map){
		map.closeInfoWindow();
	}
}

function actualizaLatLongForm() {
	var latInput = $("latitud");
	var longInput = $("longitud");
	longInput.value = ((tmpMarker.getPoint()).x);
	latInput.value = (tmpMarker.getPoint()).y;
}
/**
 * Se encarga de asociar el evento al mapa posibilitando la creacion de un marcador arrastrable. 
 * Mediante el nuevo marcador sera posible crear un nuevo lugar.(Ver como ejemplo insertalugar.jsp)
 */
function anadirEventoAnadirLugar(){
	GEvent.addListener(map,"click", function(overlay,point) {  
	
		if (!tmpMarker) {
			crearMarcadorArrastrable(overlay,point);
		}
		else{
			map.removeOverlay(tmpMarker);
			crearMarcadorArrastrable(overlay,point);
		}
	});
}

function centraMapaEnLugar(fila, coord){
	if(map && $(fila) && $(fila).hasChildNodes){
		var inputcoord = $(coord);
		if (inputcoord) {
			var lat = parseFloat(inputcoord.value.split(",")[0]);
			var lng = parseFloat(inputcoord.value.split(",")[1]);
			map.setCenter(new GLatLng(lat, lng), 15);
			buscaInfoMarcadorCentrado(lat, lng);
		}else{
			alert("LA ENTRADA NO ES HIDDEN");
		}
	}	
}
/**
 * Se encarga de abrir el globo informativo del lugar en donde se ha centrado previamente el mapa
 * segun las coordenadas tomadas como parametros
 * @param {Object} lat
 * @param {Object} lng
 */
function buscaInfoMarcadorCentrado(lat, lng){
	var encontrado = false;
	
	for (var i = 0; i < keys.length && !encontrado; i++) {
		for (var j = 0; j < grupoMarcadores[keys[i]].length && !encontrado; j++) {
			var marker = grupoMarcadores[keys[i]][j];
			if (parseFloat(grupoMarcadores[keys[i]][j].getLatLng().lat()) == lat &&
			  parseFloat(grupoMarcadores[keys[i]][j].getLatLng().lng()) == lng) {
				var htmlarrayid = lat+","+lng;
				marker.openInfoWindowHtml(htmls[htmlarrayid]);
				encontrado=true;
			}
				
		}
	}
}

var htmlInfoNuevoLugar="Ha creado un marcador. Puede arrastrarlo en<br/>"
	+ " cualquier punto del mapa que desee y luego configurar<br/>"
	+ " un nuevo lugar pulsando en el boton 'Nuevo'."
	+ "<div class='centrado'><br/><button class='mybtn' id='nuevolugar' "
	+ " onclick = 'crearFormularioNuevoLugar()'>Nuevo</button></div>";

function ponerMarcadorNuevoLugarEnCentroMapa(infoglobo, tipo, admin){
	map.clearOverlays();
	
	var icomarcador;
	var markerOptions;
	var marker;
	if(tipo){
		icomarcador = defineTipoIconoMarcador(tipo, admin);
		marker = new GMarker(map.getCenter(),{draggable:true,icon:icomarcador});
		//marker = new GMarker(map.getCenter(),{draggable:true});
	}else{
		marker = new GMarker(map.getCenter(),{draggable:true});
	}
	map.addOverlay(marker);
	$("latitud").value=marker.getPoint().y;
	$("longitud").value=marker.getPoint().x;
	var htmlglobo = "<div class='globo'>" + (infoglobo?infoglobo:htmlInfoNuevoLugar) + "</div>";
	GEvent.addListener(marker, "click", function(){
		marker.openInfoWindowHtml(htmlglobo);
	});
	GEvent.addListener(marker,"drag", function(){
			$("latitud").value=marker.getPoint().y;
			$("longitud").value=marker.getPoint().x;
	});
	GEvent.addListener(marker,"dragstart", function(){
			marker.closeInfoWindow();
	});	
	//Si no se le pasa ninguna cadena entonces el mesaje que 
	//se muestra es la dad por el codigo javascript informando 
	//al usuario de que se va a crear un nuevo marcador si asi lo desea.
	//En otro caso el globo mostrara info de un lugar previamente existente
	
	marker.openInfoWindowHtml(htmlglobo);
	
}
/**
 * 
 * @param {Object} archivo: El archivo XML con informacion de los lugares.
 * @param {Object} array_coordenadas:Permite colocar aquellos marcadores que 
 * realmente se desean tener en el mapa dadas sus coordenadas (En el caso 
 * de que NO SE QUIERAN MOSTRARSE TODOS LOS MARCADORES). Si array_coordenadas
 * no est� definido (null) entonces se mostrar�n todos los lugares por defecto.
 */
function crearMapayPonerMarcadores(archivo, array_coordenadas, admin){
	//llega bien el flag de admin
	if (GBrowserIsCompatible()) {
		if(!map)
			creaMapa();
		mgr = new GMarkerManager(map);
		
		/*******************/
		var celdaDivMapa = $("celdaDivMapa");
		GDownloadUrl(archivo, function(data) {
			var xmlDoc;
			var lugares;
			var id;
			var nom;
			var descr;
			var marcador;
			var tipos;
			if (firefox || opera &&!(ie || ie6 || ie7)) {
				xmlDoc = GXml.parse(data);
			 	lugares = xmlDoc.documentElement.getElementsByTagName("lugar");
				id = xmlDoc.documentElement.getElementsByTagName("id");
				nom = xmlDoc.documentElement.getElementsByTagName("nombre");
				descr = xmlDoc.documentElement.getElementsByTagName("descrip");
				marcador = xmlDoc.documentElement.getElementsByTagName("marcador");
				tipos = xmlDoc.documentElement.getElementsByTagName("tipo");
			}
			else{
				xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async="false";
				xmlDoc.load(archivo);
				lugares = xmlDoc.getElementsByTagName("lugar");
				id = xmlDoc.getElementsByTagName("id");
				nom = xmlDoc.getElementsByTagName("nombre");
				descr = xmlDoc.getElementsByTagName("descrip");
				marcador = xmlDoc.getElementsByTagName("marcador");
				tipos = xmlDoc.getElementsByTagName("tipo");
			}
			for (var i = 0; i < lugares.length; i++) {
				
				//OJO!!! NO VALE USAR GPOINT!!!! --> SI SE HACE NO SE MOSTRARa NINGuN MARCADOR!!!
				
				var lat = parseFloat(marcador[i].getAttribute("lat"));
				var lng = parseFloat(marcador[i].getAttribute("lng"));
				var htmlarrayid = lat + "," + lng;
				var point = new GLatLng(lat, lng);
				var tipo = GXml.value(tipos[i]);
				//htmls[i] = GXml.value(nom[i]) + "<br/>" + GXml.value(descr[i]);
				htmls[htmlarrayid] = "<div class='globo'><strong>" + GXml.value(nom[i]) +
				"</strong><hr/>" +
				GXml.value(descr[i]) +
				"</div>";
				//Si el nombre del archivo contiene 'default' entonces estamos tratando el xml con los lugares puestos 
				//por el admin que a diferencia de los del usuario registrado podran tener imagenes asociadas
				//-> y por ello habilitamos el boton para su visionado.
				var ruta;
				if (admin) {
					ruta = "../images/web/";
				}
				else {
					ruta = "images/web/";
				}
				if (archivo.indexOf("rutas") != -1 || archivo.indexOf("default") != -1) {
					htmls[htmlarrayid] += "<div class='centrado'>"
					htmls[htmlarrayid] += "<button class='btnimg' onclick='cargaGaleria(" + GXml.value(id[i]) + ")' title='Ver galeria'>";
					htmls[htmlarrayid] += "<img src='" + ruta + "galeria.png' alt='galeria'/></button>&nbsp;&nbsp;&nbsp;&nbsp;";
					htmls[htmlarrayid] += "<button class='btnimg' id='detallelugar <%=li.getId_elem_mapa()%>' title='Ver detalles' "
					htmls[htmlarrayid] += " onclick='verDetallesLugar(" + GXml.value(id[i]) + ")'>"
					htmls[htmlarrayid] += "<img src='" + ruta + "search.png' alt='Ver +'/></button>";
					htmls[htmlarrayid] += "</div>";
				}
				if(i < lugares.length - 1){
					var latnext = parseFloat(marcador[i+1].getAttribute("lat"));
					var lngnext = parseFloat(marcador[i+1].getAttribute("lng"));
					htmls[htmlarrayid] += "<button onclick='centraMapaEnLugarConInfo("+ 
						latnext + "," + lngnext +")'>&laquo;</button>";
				}
				if(i > 0){
					var latprevious= parseFloat(marcador[i-1].getAttribute("lat"));
					var lngprevious = parseFloat(marcador[i-1].getAttribute("lng"));
					htmls[htmlarrayid] += "<button onclick='centraMapaEnLugarConInfo("+ 
						latprevious + "," + lngprevious +")'>&raquo;</button>";
					
				}
				var marker;
				if (!array_coordenadas ||
				(array_coordenadas[i] &&
				array_coordenadas[i][0] == lat &&
				array_coordenadas[i][1] == lng)) {
					marker = crearMarcador(point, htmls[htmlarrayid], tipo, admin)
				}
				map.addOverlay(marker);
			}
			
		}, "text/xml");
		
	}else{
		alert("Su navegador no es compatible con nuestra aplicacion de Google Maps")
	}
}

var lataux;
var lngaux;
function centraMapaEnLugarConInfo(lat, lng){
	map.closeInfoWindow();
	//alert(htmls[lat+","+lng]);
	map.setCenter(new GLatLng(lat, lng));
	var centrado=false;
	buscaInfoMarcadorCentrado(lat,lng);
	//setTimeout("map.openInfoWindowHtml(htmls["+lataux*1+","+lngaux*1+"])", 200);
}


function centraMapaEnPrimerLugar(){
	var centrado = false;
	if(grupoMarcadores)
		for(i=0;i<keys.length && !centrado;i++){
			//alert(grupoMarcadores[keys[i]]);
			if(grupoMarcadores[keys[i]]){
				for(var j = 0 ; j<grupoMarcadores[keys[i]].length && !centrado;j++){
					var lat = parseFloat(grupoMarcadores[keys[i]][j].getPoint().y);
					var lng = parseFloat(grupoMarcadores[keys[i]][j].getPoint().x);
					//alert(lat + "$$"  + lng)
					map.setCenter(new GLatLng(lat, lng));
					grupoMarcadores[keys[i]][j].openInfoWindowHtml(htmls[lat+","+lng]);
					centrado=true;
				}
			}
		}
	else{
		alert("array de grupoMarcadores no inicializado")
	}
}

/**
 * 
 * @param {Object} array_coordenadas: Array en el que cada elemento contiene una coordenada.La coordenada sera un Array de 
 * dos elementos; la latitud y la longitud
 */

function mostrarMarcadores(array_coordenadas){

	for (var k = 0; k < keys.length; k++) {
		for(i = 0 ; i < array_coordenadas.length ; i++){
			if(grupoMarcadores[keys[k]][i]
				&& array_coordenadas[i][0] == grupoMarcadores[keys[k]][i].getLatLng().lat()
				&& array_coordenadas[i][1] == grupoMarcadores[keys[k]][i].getLatLng().lng()){
					grupoMarcadores[keys[k]][i].show();
			}
		}
	}
}

function ocultarTodosLosMarkers(){
	for (var k = 0; k < keys.length; k++) {	
		for (var i = 0; i < grupoMarcadores[keys[k]].length; i++) {	
			grupoMarcadores[keys[k]][i].hide();
		}
	}
}

/** RUTAS **/
//utilizado en mostrarRuta y mostrarMarcadores
var array_coordenadas = new Array();
//pendiente de terminar
function inicializarRutas(archivoRutas){	
	archivo = archivoRutas;
	inicializarGrupoTipoMarcadores();
	// ruta con id=69 de prueba
	//setTimeout("ocultarTodosLosMarkers()", 200);
	setTimeout("mostrarRuta(archivo,'1')", 480);
}

function mostrarRuta(archivo, id_ruta){
	GDownloadUrl(archivo,  function(data){
		//crearMapayPonerMarcadores(archivo);
		//setTimeout("ocultarTodosLosMarkers()", 200);
		var xmlDoc = GXml.parse(data); 
		var ruta = xmlDoc.getElementsByTagName("ruta");
		var elegido = -1;
		for(var i = 0 ; i < ruta.length && elegido < 0; i++){
			if(ruta[i].getAttribute("id")==id_ruta){
				elegido = i;
			}
		}
		if(elegido != -1) {
			var lugares = ruta[elegido].getElementsByTagName("lugar");
			
			/* Para entender las siguientes lineas fijarse en este ejemplo
			 * var polyline = new GPolyline([
	  			new GLatLng(37.4419, -122.1419),
	 			 new GLatLng(37.4519, -122.1519)
			], "#ff0000", 10);*/
			//Lo que queremos es construir la sentencia para luego ejecutarlo con eval
			var anchoPolyline= 8;
			var colorPolyline = "#0000ff";
			var instruccionNuevoPolyline = "var polyline = new GPolyline([";
			
			//Tomamos cada marcador de cada uno de los lugares de una ruta 
			var coord = ruta[elegido].getElementsByTagName("marcador");
			var idLugar = ruta[elegido].getElementsByTagName("id");
			var tipoLugar = ruta[elegido].getElementsByTagName("tipo");
			
			for(var i = 0  ; i<coord.length; i++){
				var lat = parseFloat(coord[i].getAttribute("lat"));
				var lng = parseFloat(coord[i].getAttribute("lng"));
				array_coordenadas[i] = new Array(lat, lng);
				instruccionNuevoPolyline+= "new GLatLng("+ lat +", " + lng  + "),";
			}
			crearMapayPonerMarcadores(archivo, array_coordenadas);
			//setTimeout("mostrarMarcadores(array_coordenadas)", 1100);
			
			instruccionNuevoPolyline+= "new GLatLng("+ parseFloat(coord[coord.length - 1].getAttribute("lat"))
			 					+", " + parseFloat(coord[coord.length - 1].getAttribute("lng"))  + ")]" 
								+ ", '"  + colorPolyline + "', " + anchoPolyline +")";
			//$("debug").innerHTML = instruccionNuevoPolyline;
			eval(instruccionNuevoPolyline);
			map.addOverlay(polyline);
		}
	});
}


var idlugarmod;

/**
 * Estas funciones se utilizan para modificar un lugar por sus coordenadas
 * @param {Object} archivoxml
 * @param {Object} id_lugar
 * @param {Object} es_admin : Permite diferenciar si la funcion se esta ejecutando en el 
 * entorno de Administrador en la aplicacion WEB.Necesario para distinguir la localizacion 
 * de los ficheros XML.
 */

var adminaux;
function inicializaYPonMarcador(archivoxml,id_lugar, es_admin){
	adminaux = es_admin;
	if (!es_admin) {
		archivo = "xml/" + archivoxml;
	}
	else {
		archivo = "../xml/" + archivoxml;
	}
	
	idlugarmod = id_lugar;
	if (GBrowserIsCompatible()) {
		creaMapa();
		mgr = new GMarkerManager(map);
		var celdaDivMapa = $("celdaDivMapa");
		if(es_admin)
			inicializarGrupoTipoMarcadores(1);
		else
			inicializarGrupoTipoMarcadores();
		setTimeout("ponerMarcadorLugarModificable(archivo, idlugarmod, adminaux)", 900);
	}	
}

function ponerMarcadorLugarModificable(archivo,id_lugar, admin){
	var lugares;
	var id;
	var nom;
	var descr;
	var marcador;
	var tipos;
	GDownloadUrl(archivo, function(data){	
		if (firefox || opera && !(ie || ie6 || ie7)) {
			xmlDoc = GXml.parse(data);
			lugares = xmlDoc.documentElement.getElementsByTagName("lugar");
			id = xmlDoc.documentElement.getElementsByTagName("id");
			nom = xmlDoc.documentElement.getElementsByTagName("nombre");
			descr = xmlDoc.documentElement.getElementsByTagName("descrip");
			marcador = xmlDoc.documentElement.getElementsByTagName("marcador");
			tipos = xmlDoc.documentElement.getElementsByTagName("tipo");
			
		}
		else{
			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.load(archivo);
			lugares = xmlDoc.getElementsByTagName("lugar");
			id = xmlDoc.getElementsByTagName("id");
			nom = xmlDoc.getElementsByTagName("nombre");
			descr = xmlDoc.getElementsByTagName("descrip");
			marcador = xmlDoc.getElementsByTagName("marcador");
			tipos = xmlDoc.getElementsByTagName("tipo");
		}
		index = -1;
		for (var i = 0; i < lugares.length && index<0; i++) {
			var idlugarbusq = GXml.value(id[i]);
			if (idlugarbusq == id_lugar) {
				index = i;
			}
		}
		if (index != -1) {
			var lat = parseFloat(marcador[index].getAttribute("lat"));
			var lng = parseFloat(marcador[index].getAttribute("lng"));
			map.setCenter(new GLatLng(lat, lng));
			var htmlarrayid = lat + "," + lng;
			var point = new GLatLng(lat, lng);
			var tipo = GXml.value(tipos[index]);
			
			var infoGlobo = "<strong>" + GXml.value(nom[index]) + "</strong> se encuentra actualmente aqu&iacute;.<br/> Puede desplazar este" +
			" marcador a un nuevo lugar si lo desea,<br/> pinchando sobre &eacute;l y arrastrando el rat&oacute;n hasta la posici&oacute;n <br/>que desee";
			if (archivo.indexOf("rutas") != -1) {
				htmls[htmlarrayid] += "<button class='mybtn' onclick = 'cargaGaleria(" + GXml.value(id[index]) + ")'>Galer&iacute;a</button>";
			}
			//var marker = crearMarcador(point, htmls[htmlarrayid], tipo);
			//map.addOverlay(marker);
			ponerMarcadorNuevoLugarEnCentroMapa(infoGlobo, tipo, admin);
		}
		else{
			alert("index == -1")
		}
	});
}

function eliminaMarcador(coordenadas, tipoElemMapa){
	tipoElemMapa = ltrim(tipoElemMapa);
	tipoElemMapa = rtrim(tipoElemMapa);
	var coordlugar = coordenadas.split(",");
	var indexkeytipo = -1;
	for(var k = 0 ; k < keys.length && indexkeytipo<0 ; k++){
		if(tipoElemMapa == keys[k]){
			tipoElemMapa = keys[k];
			indexkeytipo = k;
		}
	}
	for (var j = 0; j < grupoMarcadores[tipoElemMapa].length; j++) {
		var latitudmarker = grupoMarcadores[tipoElemMapa][j].getPoint().x;
		var longitudmarker = grupoMarcadores[tipoElemMapa][j].getPoint().y;
		if (coordlugar[0]*1 == longitudmarker && coordlugar[1]*1 == latitudmarker) {
			grupoMarcadores[tipoElemMapa][j].hide();
			grupoMarcadores[tipoElemMapa].splice(j,1); // Para borrar un elemento del array
			map.closeInfoWindow();
		}
	}
}
function ltrim(s) { 
    return s.replace(/^\s+/, ""); 
} 
function rtrim(s) { 
    return s.replace(/\s+$/, ""); 
} 

function clearArrayLugares(){
	grupoMarcadores = [];
}
